#ifndef VTKFIELDIMPORT_BOUNDARY_HPP
#define VTKFIELDIMPORT_BOUNDARY_HPP

#include "vtkFieldImport_SWEBoundary.hpp"
#include "vtkFunctions.hpp"
#include "vtkFunctions_import.hpp"
#include "vtkConstants.hpp"
#include "field.hpp"
#include "solverBase.hpp"
#include "tinyxml2.h"
#include "magic_enum.hpp"


namespace hms::vtk
{

namespace xml = tinyxml2;


std::string availableBoundaryTypes();


template<typename SolverType>
void readZeroGradient(
	const BoundaryPatch& patch,
	SolverBase<SolverType>& solver,
	typename SolverBase<SolverType>::FieldName fieldName
);


template<typename SolverType>
void readStaticValue(
	const xml::XMLElement* bcElem,
	const BoundaryPatch& patch,
	SolverBase<SolverType>& solver,
	typename SolverBase<SolverType>::FieldName fieldName
);


template<typename SolverType>
boundaryCondition::Type readBoundaryConditionType(
	const xml::XMLElement* bcElem,
	const std::string& patchName,
	typename SolverBase<SolverType>::FieldName fieldName
);


template<typename SolverType>
void readBoundaryCondition(
	const xml::XMLElement* patchElem,
	const BoundaryPatch& patch,
	SolverBase<SolverType>& solver,
	typename SolverBase<SolverType>::FieldName fieldName
);


template<typename SolverType>
void readBoundaryConditions(
	const xml::XMLDocument* doc, SolverBase<SolverType>& solver, bool skipZField
);


} // namespace hms::vtk

#include "vtkFieldImport_boundary.tpp"

#endif